/*
 * protocol_can.h
 *
 *  Created on: 2018-4-9
 *      Author: root
 */

#ifndef PROTOCOL_CAN_H_
#define PROTOCOL_CAN_H_
#ifdef __cplusplus
extern "C"{
#endif
#include "with_ui.h"
#include "program.h"
#include "include.h"
#include "meter_com.h"
struct canlink
{
   u8 addr;
   int qid;
    struct canlink * pNext;
};

typedef struct
{
	unsigned char port;	// 端口号 0,1
	unsigned char frm_gunno;	   //枪号
	unsigned char cha_addr;	// 控制器can地址 默认0xf6
	unsigned char tcu_addr;	//tcu地址 默认0x8a

}Gun_Can_Info;
typedef struct
{
	unsigned char ctrltype;	//  01：功率绝对值  02：百分比
	unsigned char optmod;	// 工作模式00：功率分配默认模  1共充  2按数据设置
	unsigned int ctrlvalue;	//功率分配数值
    unsigned char   result;    // 成功标识

}ctrlpw_bak;
typedef struct
{
	unsigned char priority;
	unsigned char pf;
	unsigned char ps;
	unsigned char sa;
	unsigned char lendata;
	unsigned char pdata[128];
}GW_Can;

typedef struct
{
   int errcode;
	out_yx  yx_data;
} main_yx;//从主控接收的摇信

typedef struct
{
	char guntab; //充电接口标识
	out_yx  yx_data;
	union u_out_mx yc_data; //遥测输出
    s_in_mx  yc_in_data;//遥测输入，电能表数据(输出到电动车）

} charge_gun;
typedef struct
{
	int errcode[8];
	charge_gun   gun[8];
} can_data;

typedef int	(*Send2Cha)(unsigned char,GW_Can* pmsg);	//命令处理函数指针

typedef int (*BackResult)(unsigned char ,void* pdata);
typedef int	(*outData2Main)(unsigned char ,void*);	//输出数据到主控


typedef struct
{
	int firm_id;//公司编号
	char type; //1直流  2 交流
	unsigned char gunnum;//枪个数，最多8个
	int ctrlpw_type;//支持的功率控制方式  0 常规 1共充  2 功率调节
	char  devNo[8];//桩编号
	char can_ver[2];//版本号
	char cannum;//can端口个数
	Gun_Can_Info* pgun_info;//发送线程参数
	canlink *p_can[2];//每个can端口产生一个链表，其中每个节点生成一个接收线程，参数是节点数据：can通信地址和传输队列ID
	int qmegid[8];//消息队列标识值，用来接收接收线程得到的数据帧
	can_data* data2main;//枪数据（包括遥测、摇信、电能表输入数据）
    Send2Cha        send2cha;//输出帧到can硬件接口函数
    BackResult   StartCharge01;//充电启动完成函数接口
    BackResult   finStartCharge;//充电完成函数接口
    BackResult   finStopCharge;//充电停止完成函数接口
    outData2Main  outyx;//摇信输出接口
    outData2Main  outyc;//遥测输出接口
    callbackFun_log writelog;
  //  outData2Main  outBMS;//BMS数据输出接口
  //  outData2Main  outBMS;//BMS数据输出接口

} Para_Can; //传到dllCan的参数

//初始化函数，pcan指向一个 para_can结构
int protocol_can_init(void * pcan); //返回0成功，1 失败
//启动充电函数guntab 充电接口标识, ctrlPW 1--启用，2--关闭。
int protocol_can_start_charge(u8 gunid,u8 ctrltype); //返回0成功，1 失败

int orderFormOther(u8 gunid,u8 type,int pvalue,int dtm,BackResult pfun);

//停止充电函数guntab 充电接口标识, cause 1-计费控制单元正常停止， 2-计费控制单元故障终止。
int protocol_can_stop_charge( u8 gunid,char stop_reason);





#ifdef __cplusplus

}

#endif
#endif /* PROTOCOL_CAN_H_ */
